From 650d65275b3ebc34d333ff4e9e408abcb3113241 Mon Sep 17 00:00:00 2001 From: robertlipe Date: Mon, 12 May 2014 15:22:53 +0000 Subject: [PATCH] Totally blind stab at implementing speed stuff on Windows, breaking my lovely OS abstraction, but I just want this code over... --- gpsbabel/gbser_posix.h | 8 ++++ gpsbabel/gbser_win.cc | 2 +- gpsbabel/gbser_win.h | 6 +++ gpsbabel/jeeps/gpsserial.cc | 84 ++++++++++++++++++++++++++++++++++++- 4 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 gpsbabel/gbser_posix.h create mode 100644 gpsbabel/gbser_win.h diff --git a/gpsbabel/gbser_posix.h b/gpsbabel/gbser_posix.h new file mode 100644 index 000000000..d6c5e78ca --- /dev/null +++ b/gpsbabel/gbser_posix.h @@ -0,0 +1,8 @@ +#ifndef gbser_posix_h +#define gbser_posix_h + +#include + +speed_t mkspeed(unsigned br); + +#endif diff --git a/gpsbabel/gbser_win.cc b/gpsbabel/gbser_win.cc index d5a28cd32..4ea910f90 100644 --- a/gpsbabel/gbser_win.cc +++ b/gpsbabel/gbser_win.cc @@ -48,7 +48,7 @@ static gbser_handle* gbser__get_handle(void* p) return h; } -static DWORD mkspeed(unsigned br) +DWORD mkspeed(unsigned br) { switch (br) { case 1200: diff --git a/gpsbabel/gbser_win.h b/gpsbabel/gbser_win.h new file mode 100644 index 000000000..7de3c2ef6 --- /dev/null +++ b/gpsbabel/gbser_win.h @@ -0,0 +1,6 @@ +#ifndef gbser_win_h +#define gbser_win_h + +DWORD mkspeed(unsigned br); + +#endif diff --git a/gpsbabel/jeeps/gpsserial.cc b/gpsbabel/jeeps/gpsserial.cc index 7591a1187..030077982 100644 --- a/gpsbabel/jeeps/gpsserial.cc +++ b/gpsbabel/jeeps/gpsserial.cc @@ -60,6 +60,7 @@ char* rxdata[] = { #if defined (__WIN32__) || defined (__CYGWIN__) #include +#include "gbser_win.h" typedef struct { HANDLE comport; @@ -226,6 +227,86 @@ int32 GPS_Serial_Read(gpsdevh* dh, void* ibuf, int size) return cnt; } +// Based on information by Kolesár András from +// http://www.manualslib.com/manual/413938/Garmin-Gps-18x.html?page=32 +int32 GPS_Serial_Set_Baud_Rate(gpsdevh* fd, int br) +{ + static UC data[4]; + GPS_PPacket tra; + GPS_PPacket rec; + win_serial_data* wsd = (win_serial_data*)fd; + + DWORD speed = mkspeed(br); + + // Turn off all requests by transmitting packet + GPS_Util_Put_Short(data, 0); + GPS_Make_Packet(&tra, 0x1c, data, 2); + if (!GPS_Write_Packet(fd,tra)) { + return gps_errno; + } + if (!GPS_Get_Ack(fd, &tra, &rec)) { + return gps_errno; + } + + GPS_Util_Put_Int(data, br); + GPS_Make_Packet(&tra, 0x30, data, 4); + if (!GPS_Write_Packet(fd,tra)) { + return gps_errno; + } + if (!GPS_Get_Ack(fd, &tra, &rec)) { + return gps_errno; + } + + // Receive IOP_BAUD_ACPT_DATA + if (!GPS_Packet_Read(fd, &rec)) { + return gps_errno; + } + + // Acnowledge new speed + if (!GPS_Send_Ack(fd, &tra, &rec)) { + return gps_errno; + } + GPS_Device_Flush(fd); + GPS_Device_Wait(fd); + + // Sleep for a small amount of time, about 100 milliseconds, + // to make sure the packet was successfully transmitted to the GPS unit. + gb_sleep(100000); + + // Change port speed + DCB tio; + tio.DCBlength = sizeof(DCB); + + GetCommState(wsd->comport, &tio); + tio.BaudRate = speed;; + if (!SetCommState(wsd->comport, &tio)) { + GPS_Serial_Error("SetCommState on port for alternate bit rate failed"); + CloseHandle(wsd->comport); + return 0; + } + + GPS_Util_Put_Short(data, 0x3a); + GPS_Make_Packet(&tra, 0x0a, data, 2); + if (!GPS_Write_Packet(fd,tra)) { + return gps_errno; + } + if (!GPS_Get_Ack(fd, &tra, &rec)) { + return gps_errno; + } + + GPS_Util_Put_Short(data, 0x3a); + GPS_Make_Packet(&tra, 0x0a, data, 2); + if (!GPS_Write_Packet(fd,tra)) { + return gps_errno; + } + if (!GPS_Get_Ack(fd, &tra, &rec)) { + return gps_errno; + } + + if (global_opts.debug_level >= 1) fprintf(stderr, "Serial port speed set to %d\n", br); + return 0; + +} #else #include "gbser_posix.h" @@ -541,9 +622,8 @@ int32 GPS_Serial_Set_Baud_Rate(gpsdevh* fd, int br) static UC data[4]; GPS_PPacket tra; GPS_PPacket rec; - speed_t speed; - speed = mkspeed(br); + speed_t speed = mkspeed(br); // Turn off all requests by transmitting packet GPS_Util_Put_Short(data, 0); -- 2.30.2